﻿using System.Text;

namespace apitest.Application
{
    public class SSEService 
    {
        public readonly ISqlSugarClient _db;
        public SSEService(ISqlSugarClient db)
        {
            _db = db;
        }

        [HttpGet]
        public async Task<dynamic> T1()
        {
            App.HttpContext.Response.ContentType = "text/event-stream";
            for (int i = 0; i < 10; i++)
            {
                string data =
                    $"id: {Guid.NewGuid().ToString()} \n" +
                    $"retry: 1000\n" +
                    $"event: message\n" +
                    $"data: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}\n\n";
                var bitys = Encoding.UTF8.GetBytes(data);

                await App.HttpContext.Response.Body.WriteAsync(bitys);
                await App.HttpContext.Response.Body.FlushAsync();
                Thread.Sleep(2000);
            }

            return null;
        }

        [HttpGet]
        public async Task T2()
        {
            //测试，debug到这里的时候你会发现，协议使用的是HTTP/2. APS.NET Core 2.1以上就默认支持HTTP/2，无需额外的配置。再Windows Server2016/Windows10+会自动提供支持。
            string requestProtocol = App.HttpContext.Request.Protocol;
            var response = App.HttpContext.Response;
            //响应头部添加text/event-stream，这是HTTP/2协议的一部分。
            response.Headers.Add("Content-Type", "text/event-stream");
            for (int i = 0; i < 100; i++)
            {
                await App.HttpContext.Response.WriteAsync($"id:{Guid.NewGuid().ToString()}\n");
                // event:ping event是事件字段名，冒号后面是事件名称，不要忘了\n换行符。
                await App.HttpContext.Response.WriteAsync($"event:message\n");

                // data: 是数据字段名称，冒号后面是数据字段内容。注意数据内容仅仅支持UTF-8，不支持二进制格式。
                // data后面的数据当然可以传递JSON String的。
                await App.HttpContext.Response.WriteAsync($"data:Controller {i} at {DateTime.Now}\r\r");

                // 写入数据到响应后不要忘记 FlushAsync()，因为该api方法是异步的，所以要全程异步，调用同步方法会报错。
                await App.HttpContext.Response.Body.FlushAsync();

                //模拟一个1秒的延迟。
                await Task.Delay(1000);
            }

            //数据发送完毕后关闭连接。
            App.HttpContext.Response.Body.Close();

        }
    }
}
